package com.smart.car.gateway.config;

import com.smart.car.auth.utils.RsaUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.io.File;
import java.security.PrivateKey;
import java.security.PublicKey;

/**
 * JWT网关鉴权属性类，用来读取yml中配置的jwt信息来初始化公钥和私钥
 *  gateway.jwt 对应yml中的配置名称
 * @author: zoutao
 * @date: 2021/4/29
 */
@Slf4j
@Data
//@Configuration
//@PropertySource("classpath:application.yml") //多配置时指定
@ConfigurationProperties(prefix = "gateway.jwt")
public class JwtProperties {

    /**
     * 自定义的密钥
     */
    private String secret;

    /**
     * 公钥文件地址
     */
    private String pubKeyPath;

    /**
     * 私钥文件地址
     */
    private String priKeyPath;

    /**
     * token过期时间
     */
    private int expire;

    /**
     * cookie名称
     */
    private String cookieName;

    /**
     * 公钥
     */
    private PublicKey publicKey;

    /**
     * 私钥
     */
    private PrivateKey privateKey;

    /**
     * 放行的url
     */
    private String[] skipAuthUrls;

    /**
     * PostConstruct修饰的方法会在服务器加载Servlet时运行
     * 并且只会被服务器调用一次。
     */
    @PostConstruct
    public void init() {
        try {
            // 获取公钥
            log.info("网关获取公钥地址: " + pubKeyPath);
            this.publicKey = RsaUtils.getPublicKey(pubKeyPath);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("初始化公钥和私钥失败！" +e);
            throw new RuntimeException();
        }
    }
}